#define _POSIX_C_SOURCE 200809L  // 启用POSIX.1-2008标准<Paste>

#include<stdio.h>
#include<unistd.h>
#include<sys/wait.h>
#include<stdlib.h>
#include<sys/types.h>
int putenv(char *string);  // 成功返回0，失败返回非0
int main()
{
    extern char **environ;
    
    //为子进程设置一个环境变量
    char ptr[]="MYENV=66666";
    //putenv(ptr);//父子进程都设置环境变量
    //setenv("MYENV", "66666", 1);
    pid_t id=fork();
    if(id==0)
    {
        //child
        printf("I am child pid=%d ppid=%d\n",getpid(),getppid());

        putenv(ptr);//只在子进程中设置环境变量，不会出现在父进程中
        //第一个参数是可执行文件位置，第二个是可执行文件名，然后是命令行参数，最后是环境变量参数    由于我们自定义了环境变量，所以继承的进程会把环境变量替换成我们写的
        execle("./mytest2","mytest2","ls","-l",NULL,environ);//最后必须加NULL结束
        
        printf("我是子进程后续\n");
        exit(1);
    }
    int status=0;
    pid_t ret=waitpid(-1,&status,0);
    if(ret>0)
    {
        printf("waitpid success\n");
        printf("exitcode=%d\n",(status>>8)&0xFF);
    }
    else{
        printf("等待失败\n");
    }
    printf("MYENV:%s\n",getenv("MYENV"));

    printf("PATH:%s\n",getenv("PATH"));
    return 0;
}
